// 游戏控制类 控制其他类
import Snake from './Snake'
import Foot from './Foot'
import ScorePanel from './ScorePanel'

class GameControl {
  snake: Snake
  foot: Foot
  scorePanel: ScorePanel
  // 创建一个来存储移动方向的
  direction: string = ''
  // 记录游戏是否结束
  isLive: boolean = true
  constructor() {
    this.snake = new Snake()
    this.foot = new Foot()
    this.scorePanel = new ScorePanel()
    this.init()
  }
  init() {
    // 绑定键盘事件
    document.addEventListener('keydown', this.keydownHandler.bind(this))
    this.run()
  }
  // 键盘按下的响应事件
  keydownHandler(event: KeyboardEvent) {
    // 修改direction属性
    this.direction = event.key
  }
  // 蛇的移动事件
  run() {
    // 获取蛇的当前坐标
    let X = this.snake.X
    let Y = this.snake.Y
    // 根据按键修改x、y值
    switch (this.direction) {
      case 'ArrowUp':
      case 'Up':
        Y -= 10
        break
      case 'ArrowDown':
      case 'Down':
        Y += 10
        break
      case 'ArrowLeft':
      case 'Left':
        X -= 10
        break
      case 'ArrowRight':
      case 'Right':
        X += 10
        break
      default:
        break
    }
    // 蛇是否吃到食物
    this.checkEat(X, Y)
    // 修改蛇的坐标
    try {
      this.snake.X = X
      this.snake.Y = Y
    } catch (e: any) {
      alert(e.message + '游戏结束')
      this.isLive = false
    }
    // 开启定时调用
    this.isLive &&
      setTimeout(this.run.bind(this), 300 - (this.scorePanel.level - 1) * 30)
  }
  // 检查蛇是否吃的食物
  checkEat(X: number, Y: number) {
    if (X === this.foot.X && Y === this.foot.Y) {
      // 食物位置变化
      this.foot.change()
      // 分数增加
      this.scorePanel.addScore()
      // 蛇增加一节
      this.snake.addBody()
    }
  }
}
export default GameControl
